package bluetooth

import (
	"fmt"
	"math"
	"time"
)

// 设备类型常量
const (
	DeviceTypeSmokeDetector = "smoke_detector" // 烟感设备
	DeviceTypePersonnel     = "personnel"      // 模拟人员设备
)

// ScannedDevice 扫描到的蓝牙设备
type ScannedDevice struct {
	Name     string    `json:"name"`      // 设备名称
	MAC      string    `json:"mac"`       // MAC地址
	RSSI     int       `json:"rssi"`      // 当前信号强度
	TxPower  int       `json:"tx_power"`  // 1米处的信号强度
	LastSeen time.Time `json:"last_seen"` // 最后一次发现时间
	Type     string    `json:"type"`      // 设备类型：smoke_detector(烟感设备) 或 personnel(模拟人员设备)
	IsMock   bool      `json:"is_mock"`   // 是否为模拟数据
}

// String 返回设备的字符串表示
func (d *ScannedDevice) String() string {
	return fmt.Sprintf("Device{Name: %s, MAC: %s, RSSI: %d, TxPower: %d, LastSeen: %s}",
		d.Name, d.MAC, d.RSSI, d.TxPower, d.LastSeen.Format("15:04:05"))
}

// EstimateDistance 估算设备距离（米）
func (d *ScannedDevice) EstimateDistance() float64 {
	if d.TxPower == 0 {
		return -1 // 无法估算
	}

	// 使用简单的路径损耗模型估算距离
	// 距离 = 10 ^ ((TxPower - RSSI) / (10 * N))
	// 其中N是路径损耗因子，一般在2-4之间，这里使用2.5
	ratio := float64(d.TxPower-d.RSSI) / (10 * 2.5)
	return math.Pow(10, ratio)
}
